以下內容皆參考 Backtrader 官網
之前介紹了 shioaji 如何取得資料, 下單,也介紹了如何利用 Line 和 api 互動,接下來要介紹的是程式交易中,很重要的一塊交易策略,也就是我們訂下一個買入和賣出的時間點,譬如說 5 日均線突破 20 日均線買進,5 日均線跌破 20 日均線時賣出,這就是一個策略,一個策略好壞怎麼判定,可以利用歷史資料來做回策,所謂的回測,就是使用歷史資料,搭配自己的策略去進行操作,這樣就可以知道自己的策略歷史的投資報酬率是多少,雖然是歷史資料,不過還是挺有參考價值的。
本次要介紹的工具就是 Backtrader,是一套 python 平台的交易策略工具,配合 shioaji 可以取得歷史資料來進行我們交易策略的評估,今天就先介紹怎麼利用 shioaji 來取得需要的資料
pip install backtrader matplotlib==3.2.2
matplotlib 比較新的版本在畫圖的時候會有問題,所以指定 3.2.2 版安裝
import shioaji as sj
api = sj.Shioaji()
api.login(person_id="帳號", passwd="密碼")
stock2330 = api.Contracts.Stocks["2330"]
# 台積電 2020 年的歷史資料
kbar = api.kbars(stock2330, '2020-01-01', '2020-12-31')
from datetime import datetime
dts = list(map(lambda x:datetime.utcfromtimestamp(x/10**9), kbar.ts))
df = pd.DataFrame(
{
"open": pd.Series(kbar.Open),
"high": pd.Series(kbar.High),
"low": pd.Series(kbar.Low),
"close": pd.Series(kbar.Close),
"volume": pd.Series(kbar.Volume),
}
)
df.index = pd.Index(dts)
import backtrader as bt
# 這二行是 jupyter notebook 要畫圖使用,如果不是用 jupyter notebook 或是沒有畫圖的需求可以不用
import matplotlib.pyplot as plt
%matplotlib inline
cerebro = bt.Cerebro(stdstats=False)
# 引用一個空的策略
cerebro.addstrategy(bt.Strategy)
data = bt.feeds.PandasData(
# Panda.DataFrame 變數名稱
dataname = df,
# 因為 kbar 取得的資料是分鐘為單位,如果是用其它的資料,可以自己改
timeframe = bt.TimeFrame.Minutes
)
# 因為匯入的資料是分鐘,我們希望是用每日的資料,所以這邊轉成日
cerebro.resampledata(data, timeframe=bt.TimeFrame.Days, compression = 1)
# matplot 設定 (如果不是在 jupyter notebook 這一段可以省)
plt.rcParams["figure.figsize"] = [15, 12] # inch
plt.rcParams.update({'font.size': 12})
# iplot = False 是 jupyter notebook 用的
create.plot(style="bar", iplot=False)
這邊就簡單介紹怎麼將 shioaji 的資料匯入到 Backtrader 裡,明天再繼續我們的第一個策略